<!DOCTYPE html>

<html lang="
zh-CN"
    >

        <head>
            
                <title>
                    
                        Mysql数据库 -
                            
                                shanX&#39;s Blog
                </title>
                <meta charset="UTF-8">
                <meta name="description" content="">
                <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=5">
                
                    

                        <link rel="shortcut icon" href="/image/author.png" type="image/png" />
                        <meta name="description" content="MySQL数据库">
<meta property="og:type" content="article">
<meta property="og:title" content="Mysql数据库">
<meta property="og:url" content="https://rhymexmove.github.io/2021/04/27/b8128014f023/index.html">
<meta property="og:site_name" content="shanX&#39;s Blog">
<meta property="og:description" content="MySQL数据库">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://rhymexmove.github.io/2021/04/27/b8128014f023/image/article/Mysql%E6%95%B0%E6%8D%AE%E5%BA%93-20210427/1NF-1.png">
<meta property="og:image" content="https://rhymexmove.github.io/2021/04/27/b8128014f023/image/article/Mysql%E6%95%B0%E6%8D%AE%E5%BA%93-20210427/1NF-2.png">
<meta property="og:image" content="https://rhymexmove.github.io/2021/04/27/b8128014f023/image/article/Mysql%E6%95%B0%E6%8D%AE%E5%BA%93-20210427/2NF-1.png">
<meta property="og:image" content="https://rhymexmove.github.io/2021/04/27/b8128014f023/image/article/Mysql%E6%95%B0%E6%8D%AE%E5%BA%93-20210427/2NF-2.png">
<meta property="og:image" content="https://rhymexmove.github.io/2021/04/27/b8128014f023/image/article/Mysql%E6%95%B0%E6%8D%AE%E5%BA%93-20210427/2NF-3.png">
<meta property="og:image" content="https://rhymexmove.github.io/2021/04/27/b8128014f023/image/article/Mysql%E6%95%B0%E6%8D%AE%E5%BA%93-20210427/3NF-1.png">
<meta property="og:image" content="https://rhymexmove.github.io/2021/04/27/b8128014f023/image/article/Mysql%E6%95%B0%E6%8D%AE%E5%BA%93-20210427/3NF-2.png">
<meta property="og:image" content="https://rhymexmove.github.io/2021/04/27/b8128014f023/image/article/Mysql%E6%95%B0%E6%8D%AE%E5%BA%93-20210427/3NF-3.png">
<meta property="og:image" content="https://rhymexmove.github.io/2021/04/27/b8128014f023/image/article/Mysql%E6%95%B0%E6%8D%AE%E5%BA%93-20210427/20210427182334.png">
<meta property="og:image" content="https://rhymexmove.github.io/2021/04/27/b8128014f023/image/article/Mysql%E6%95%B0%E6%8D%AE%E5%BA%93-20210427/20210427182427.png">
<meta property="og:image" content="https://rhymexmove.github.io/2021/04/27/b8128014f023/image/article/Mysql%E6%95%B0%E6%8D%AE%E5%BA%93-20210427/20210427183235.png">
<meta property="article:published_time" content="2021-04-27T14:28:17.000Z">
<meta property="article:modified_time" content="2022-04-07T17:25:27.702Z">
<meta property="article:author" content="shanX">
<meta property="article:tag" content="狂神说">
<meta property="article:tag" content="mysql">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://rhymexmove.github.io/2021/04/27/b8128014f023/image/article/Mysql%E6%95%B0%E6%8D%AE%E5%BA%93-20210427/1NF-1.png">
                            <link rel="stylesheet" href="https://cdn.jsdelivr.net/combine/npm/highlight.js@9.15.8/styles/atom-one-dark.css,gh/theme-nexmoe/hexo-theme-nexmoe@latest/source/lib/mdui_043tiny/css/mdui.css,gh/theme-nexmoe/hexo-theme-nexmoe@latest/source/lib/iconfont/iconfont.css,gh/fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.css?v=233"
                                crossorigin>
                            <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/justifiedGallery@3.8.1/dist/css/justifiedGallery.min.css">
                            <!--适用于 Retina 屏的 iPad-->
                            <link rel="apple-touch-icon-precomposed" sizes="144x144" href="https://cdn.jsdelivr.net/gh/RhymeXmove/blogimg@latest/author.png">
                            <!--适用于 Retina 屏的 iPhone-->
                            <link rel="apple-touch-icon-precomposed" sizes="120x120" href="https://cdn.jsdelivr.net/gh/RhymeXmove/blogimg@latest/author.png">
                            <!--适用于非 Retina 屏的 iPad-->
                            <link rel="apple-touch-icon-precomposed" sizes="72x72" href="https://cdn.jsdelivr.net/gh/RhymeXmove/blogimg@latest/author.png">
                            <!--适用于非 Retina 屏的 iPhone-->
                            <link rel="apple-touch-icon-precomposed" href="https://cdn.jsdelivr.net/gh/RhymeXmove/blogimg@latest/author.png">
                            
                                <link rel="stylesheet" href="//at.alicdn.com/t/font_2490857_fmjyoao96km.css">
                                
                                    <link rel="stylesheet" href="/css/style.css?v=1649858550924">
        <meta name="generator" content="Hexo 5.4.0"></head>

        <body class="mdui-drawer-body-left">
            
                <div id="nexmoe-background">
                    <div class="nexmoe-bg" style="background-image: url(https://cdn.jsdelivr.net/gh/RhymeXmove/blogimg@latest/cover/5887c2f1-b191-4890-aab5-2ce62d9955df.jpg)"></div>
                    <div class="mdui-appbar mdui-shadow-0">
                        <div class="mdui-toolbar">
                            <a mdui-drawer="{target: '#drawer', swipe: true}" title="menu" class="mdui-btn mdui-btn-icon mdui-ripple"><i class="mdui-icon nexmoefont icon-menu"></i></a>
                            <div class="mdui-toolbar-spacer"></div>
                            <!--<a href="javascript:;" class="mdui-btn mdui-btn-icon"><i class="mdui-icon material-icons">search</i></a>-->
                            <a href="/" title="shanX" class="mdui-btn mdui-btn-icon"><img src="https://cdn.jsdelivr.net/gh/RhymeXmove/blogimg@latest/author.png" alt="shanX"></a>
                        </div>
                    </div>
                </div>
                <div id="nexmoe-header">
                    <div class="nexmoe-drawer mdui-drawer" id="drawer">
    <div class="nexmoe-avatar mdui-ripple">
        <a href="/" title="shanX">
            <img src="https://cdn.jsdelivr.net/gh/RhymeXmove/blogimg@latest/author.png" alt="shanX" alt="shanX">
        </a>
    </div>
    <div class="nexmoe-count nexmoe-widget-wrap">
        <div><span>文章</span>30</div>
        <div><span>标签</span>16</div>
        <div><span>分类</span>8</div>
    </div>
    <div class="nexmoe-list mdui-list nexmoe-widget-wrap" mdui-collapse="{accordion: true}">
        
        <a class="nexmoe-list-item mdui-list-item mdui-ripple" href="/" title="回到首页">
            <i class="mdui-list-item-icon nexmoefont icon-home"></i>
            <div class="mdui-list-item-content">
                回到首页
            </div>
        </a>
        
        <a class="nexmoe-list-item mdui-list-item mdui-ripple" href="/archives.html" title="文章归档">
            <i class="mdui-list-item-icon nexmoefont icon-container"></i>
            <div class="mdui-list-item-content">
                文章归档
            </div>
        </a>
        
        <a class="nexmoe-list-item mdui-list-item mdui-ripple" href="/cesium-test/index.html" title="Cesium">
            <i class="mdui-list-item-icon nexmoefont icon-Cesium-copy"></i>
            <div class="mdui-list-item-content">
                Cesium
            </div>
        </a>
        
        <a class="nexmoe-list-item mdui-list-item mdui-ripple" href="/cesium-covid/index.html" title="全球疫情">
            <i class="mdui-list-item-icon nexmoefont icon-areachart"></i>
            <div class="mdui-list-item-content">
                全球疫情
            </div>
        </a>
        
        <a class="nexmoe-list-item mdui-list-item mdui-ripple" href="/about.html" title="关于博客">
            <i class="mdui-list-item-icon nexmoefont icon-info-circle"></i>
            <div class="mdui-list-item-content">
                关于博客
            </div>
        </a>
        
    </div>
    <aside id="nexmoe-sidebar">
  
  <div class="nexmoe-widget-wrap">
    <div class="nexmoe-widget nexmoe-search">
        <form id="search_form" action_e="https://cn.bing.com/search?q=rhymexmove.github.io" onsubmit="return search();">
            <label><input id="search_value" name="q" type="search" placeholder="搜索"></label>
        </form>
    </div>
</div>
  
  <div class="nexmoe-widget-wrap">
    <div class="nexmoe-widget nexmoe-social">
        <a class="mdui-ripple" href="https://space.bilibili.com/20666214" target="_blank" mdui-tooltip="{content: '哔哩哔哩'}" style="color: rgb(231, 106, 141);background-color: rgba(231, 106, 141, .15);">
            <i class="nexmoefont icon-bilibili"></i>
        </a><a class="mdui-ripple" href="https://github.com/RhymeXmove/" target="_blank" mdui-tooltip="{content: 'GitHub'}" style="color: rgb(231, 106, 141);background-color: rgba(231, 106, 141, .15);">
            <i class="nexmoefont icon-github"></i>
        </a><a class="mdui-ripple" href="https://gitee.com/shanxin123/" target="_blank" mdui-tooltip="{content: 'Gitee'}" style="color: rgb(220,20,60);background-color: rgba(220,20,60, .15);">
            <i class="nexmoefont icon-gitee"></i>
        </a>
    </div>
</div>
  
  
    <div class="nexmoe-widget-wrap">
        <h3 class="nexmoe-widget-title">
            文章分类
        </h3>
        <div class="nexmoe-widget">

            <ul class="category-list">

                


                    

                        

                            <li class="category-list-item">
                                <a class="category-list-link" href="/categories/mysql/">
                                    -mysql
                                </a>
                                <span class="category-list-count">1</span>
                            </li>

                            

                            <li class="category-list-item">
                                <a class="category-list-link" href="/categories/Cesium/">
                                    Cesium
                                </a>
                                <span class="category-list-count">3</span>
                            </li>

                            

                            <li class="category-list-item">
                                <a class="category-list-link" href="/categories/DB/">
                                    DB
                                </a>
                                <span class="category-list-count">2</span>
                            </li>

                            

                            <li class="category-list-item">
                                <a class="category-list-link" href="/categories/Leetcode/">
                                    Leetcode
                                </a>
                                <span class="category-list-count">4</span>
                            </li>

                            

                            <li class="category-list-item">
                                <a class="category-list-link" href="/categories/Vue/">
                                    Vue
                                </a>
                                <span class="category-list-count">2</span>
                            </li>

                            

                            <li class="category-list-item">
                                <a class="category-list-link" href="/categories/blog搭建/">
                                    blog搭建
                                </a>
                                <span class="category-list-count">1</span>
                            </li>

                            

                            <li class="category-list-item">
                                <a class="category-list-link" href="/categories/java/">
                                    java
                                </a>
                                <span class="category-list-count">12</span>
                            </li>

                            

                            <li class="category-list-item">
                                <a class="category-list-link" href="/categories/资源/">
                                    资源
                                </a>
                                <span class="category-list-count">1</span>
                            </li>

                            
            </ul>

        </div>
    </div>
    
  
  
  <div class="nexmoe-widget-wrap">
    <div id="randomtagcloud" class="nexmoe-widget tagcloud nexmoe-rainbow">
      <a href="/tags/DB/" style="font-size: 10px;">-DB</a> <a href="/tags/Cesium/" style="font-size: 12.5px;">Cesium</a> <a href="/tags/GIS/" style="font-size: 10px;">GIS</a> <a href="/tags/Leetcode/" style="font-size: 15px;">Leetcode</a> <a href="/tags/Vue/" style="font-size: 12.5px;">Vue</a> <a href="/tags/blog%E6%90%AD%E5%BB%BA/" style="font-size: 10px;">blog搭建</a> <a href="/tags/echart/" style="font-size: 10px;">echart</a> <a href="/tags/java/" style="font-size: 10px;">java</a> <a href="/tags/java%E5%9F%BA%E7%A1%80/" style="font-size: 20px;">java基础</a> <a href="/tags/mysql/" style="font-size: 10px;">mysql</a> <a href="/tags/spring/" style="font-size: 10px;">spring</a> <a href="/tags/vue/" style="font-size: 10px;">vue</a> <a href="/tags/%E6%89%B9%E5%A4%84%E7%90%86%E5%B7%A5%E5%85%B7/" style="font-size: 10px;">批处理工具</a> <a href="/tags/%E6%95%B0%E6%8D%AE%E5%BA%93/" style="font-size: 10px;">数据库</a> <a href="/tags/%E7%8B%82%E7%A5%9E%E8%AF%B4/" style="font-size: 17.5px;">狂神说</a> <a href="/tags/%E8%B5%84%E6%BA%90/" style="font-size: 10px;">资源</a>
    </div>
    
  </div>

  
  
  <div class="nexmoe-widget-wrap">
    <h3 class="nexmoe-widget-title">文章归档</h3>
    <div class="nexmoe-widget">
      <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/archives/2022/">2022</a><span class="archive-list-count">1</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2021/">2021</a><span class="archive-list-count">29</span></li></ul>
    </div>
  </div>



  
  
  <div class="nexmoe-widget-wrap">
    <h3 class="nexmoe-widget-title">最新文章</h3>
    <div class="nexmoe-widget">
      <ul>
        
          <li>
            <a href="/2022/04/13/7533e8f3cb4c/">mysql查询数据库内全部表名；查询表内全部字段名</a>
          </li>
        
          <li>
            <a href="/2021/09/26/ee931b51117c/">什么是计算机图形学？</a>
          </li>
        
          <li>
            <a href="/2021/09/08/9adeea845004/">中国城市坐标(包含市辖区)</a>
          </li>
        
          <li>
            <a href="/2021/08/31/7ba201dda6cb/">Cesium billboard贴地形表</a>
          </li>
        
          <li>
            <a href="/2021/08/09/0d3ed7d31d83/">Vue中使用Vue-jsonp请求jsonp数据</a>
          </li>
        
      </ul>
    </div>
  </div>

  
</aside>
    <div class="nexmoe-copyright">
        &copy; 2022 shanX
        Powered by <a href="http://hexo.io/" target="_blank">Hexo</a>
        & <a href="https://github.com/theme-nexmoe/hexo-theme-nexmoe" target="_blank">Nexmoe</a>
        
    </div>
</div><!-- .nexmoe-drawer -->
                </div>
                <div id="nexmoe-content">
                    <div class="nexmoe-primary">
                        <div class="nexmoe-post">

  <div class="nexmoe-post-right">
    
      <div class="nexmoe-fixed">
        <div class="nexmoe-valign">
            <div class="nexmoe-toc">
                
                
                  <ol class="toc"><li class="toc-item toc-level-1"><a class="toc-link" href="#MySQL%E6%95%B0%E6%8D%AE%E5%BA%93"><span class="toc-number">1.</span> <span class="toc-text">MySQL数据库</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#%E6%95%B0%E6%8D%AE%E5%BA%93%E5%BC%95%E6%93%8E%E7%9A%84%E7%B1%BB%E5%9E%8B"><span class="toc-number">1.1.</span> <span class="toc-text">数据库引擎的类型</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%B8%89%E5%A4%A7%E8%8C%83%E5%BC%8F"><span class="toc-number">1.2.</span> <span class="toc-text">三大范式</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#JDBC"><span class="toc-number">1.3.</span> <span class="toc-text">JDBC</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#Statement%E5%AF%B9%E8%B1%A1"><span class="toc-number">1.3.1.</span> <span class="toc-text">Statement对象</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%B7%A5%E5%85%B7%E7%B1%BB-JdbcUtils"><span class="toc-number">1.3.2.</span> <span class="toc-text">工具类   JdbcUtils</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%A2%9E%E5%88%A0%E6%94%B9%E9%83%BD%E6%98%AFst-executeUpdate-sql"><span class="toc-number">1.3.3.</span> <span class="toc-text">增删改都是st.executeUpdate(sql)</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E6%9F%A5%E8%AF%A2st-executeQuery-sql"><span class="toc-number">1.3.4.</span> <span class="toc-text">查询st.executeQuery(sql);</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#SQL%E6%B3%A8%E5%85%A5"><span class="toc-number">1.3.5.</span> <span class="toc-text">SQL注入</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#preparedStatement-%E5%AF%B9%E8%B1%A1"><span class="toc-number">1.3.6.</span> <span class="toc-text">preparedStatement 对象</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Idea%E8%BF%9E%E6%8E%A5mysql%E6%95%B0%E6%8D%AE%E5%BA%93"><span class="toc-number">1.4.</span> <span class="toc-text">Idea连接mysql数据库</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E6%95%B0%E6%8D%AE%E5%BA%93%E8%A1%A8%E4%BA%8B%E5%8A%A1"><span class="toc-number">1.5.</span> <span class="toc-text">数据库表事务</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%8E%9F%E5%AD%90%E6%80%A7%EF%BC%88Atomicity%EF%BC%89"><span class="toc-number">1.5.1.</span> <span class="toc-text">原子性（Atomicity）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E4%B8%80%E8%87%B4%E6%80%A7%EF%BC%88Consistency%EF%BC%89"><span class="toc-number">1.5.2.</span> <span class="toc-text">一致性（Consistency）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E9%9A%94%E7%A6%BB%E6%80%A7%EF%BC%88Isolation%EF%BC%89"><span class="toc-number">1.5.3.</span> <span class="toc-text">隔离性（Isolation）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E6%8C%81%E4%B9%85%E6%80%A7%EF%BC%88Durability%EF%BC%89"><span class="toc-number">1.5.4.</span> <span class="toc-text">持久性（Durability）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%84%8F%E8%AF%BB"><span class="toc-number">1.5.5.</span> <span class="toc-text">脏读</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E4%B8%8D%E5%8F%AF%E9%87%8D%E5%A4%8D%E8%AF%BB"><span class="toc-number">1.5.6.</span> <span class="toc-text">不可重复读</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%99%9A%E8%AF%BB-%E5%B9%BB%E8%AF%BB"><span class="toc-number">1.5.7.</span> <span class="toc-text">虚读(幻读)</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#java%E4%BB%A3%E7%A0%81%E5%AE%9E%E7%8E%B0%E4%BA%8B%E5%8A%A1"><span class="toc-number">1.5.8.</span> <span class="toc-text">java代码实现事务</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5%E6%B1%A0"><span class="toc-number">1.6.</span> <span class="toc-text">数据库连接池</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#DBCP"><span class="toc-number">1.7.</span> <span class="toc-text">DBCP</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#C3P0"><span class="toc-number">1.8.</span> <span class="toc-text">C3P0</span></a></li></ol></li></ol>
                
            </div>
        </div>
      </div>
    
  </div>

  <article>
    
        <div class="nexmoe-post-cover" style="padding-bottom: NaN%;"> 
            <img data-src="https://cdn.jsdelivr.net/gh/RhymeXmove/blogimg@latest/cover/mysql.png" data-sizes="auto" alt="Mysql数据库" class="lazyload">
            <h1>Mysql数据库</h1>
        </div>
    
    
    <div class="nexmoe-post-meta nexmoe-rainbow-fill" style="margin:10px 0!important;">
    <a><i class="nexmoefont icon-calendar-fill"></i>2021年04月27日</a>
    <a><i class="nexmoefont icon-areachart"></i>3.9k 字</a>
    <a><i class="nexmoefont icon-time-circle-fill"></i>大概 17 分钟</a>
</div>

    <h1 id="MySQL数据库"><a href="#MySQL数据库" class="headerlink" title="MySQL数据库"></a>MySQL数据库</h1><span id="more"></span>

<h2 id="数据库引擎的类型"><a href="#数据库引擎的类型" class="headerlink" title="数据库引擎的类型"></a>数据库引擎的类型</h2><table>
<thead>
<tr>
<th></th>
<th>MYISAM</th>
<th>INNODB</th>
</tr>
</thead>
<tbody><tr>
<td>事务支持</td>
<td>不支持</td>
<td>支持</td>
</tr>
<tr>
<td>数据行锁定</td>
<td>不支持</td>
<td>支持</td>
</tr>
<tr>
<td>外键约束</td>
<td>不支持</td>
<td>支持</td>
</tr>
<tr>
<td>全文索引</td>
<td>支持</td>
<td>不支持</td>
</tr>
<tr>
<td>表空间的大小</td>
<td>较小</td>
<td>较大，约为2倍</td>
</tr>
</tbody></table>
<p>常规使用操作：</p>
<ul>
<li>MYISAM 节约空间，速度较快</li>
<li>INNODB 安全性高，事务的处理，多表多用户操作</li>
</ul>
<p>所有的数据库文件都存在data目录下，一个文件夹对应一个数据库，本质还是文件的存储！</p>
<p>MySQL引擎在物理文件上的区别：</p>
<ul>
<li>InnoDB 在数据库表中只有一个 <code>*.fm</code> 文件，以及上级目录下的 <code>ibdata1</code> 文件；</li>
<li>MYISAM 对应文件<ul>
<li>*.frm       表结构的定义文件</li>
<li>*.MYD     数据文件（data）</li>
<li>*.MYI       索引文件（index）</li>
</ul>
</li>
</ul>
<h2 id="三大范式"><a href="#三大范式" class="headerlink" title="三大范式"></a>三大范式</h2><p>前<a target="_blank" rel="noopener" href="https://baike.baidu.com/item/%E5%85%B3%E7%B3%BB%E6%95%B0%E6%8D%AE%E5%BA%93/1237340">关系数据库</a>有六种范式：第一范式（1NF）、第二范式（2NF）、第三范式（3NF）、巴斯-科德范式（BCNF）、<a target="_blank" rel="noopener" href="https://baike.baidu.com/item/%E7%AC%AC%E5%9B%9B%E8%8C%83%E5%BC%8F/3193985">第四范式</a>(4NF）和<a target="_blank" rel="noopener" href="https://baike.baidu.com/item/%E7%AC%AC%E4%BA%94%E8%8C%83%E5%BC%8F/5025271">第五范式</a>（5NF，又称完美范式）。</p>
<p>而通常我们用的最多的就是第一范式（1NF）、第二范式（2NF）、第三范式（3NF），也就是本文要讲的“三大范式”。</p>
<p><strong>第一范式（1NF）：要求数据库表的每一列都是不可分割的原子数据项。</strong></p>
<p>举例说明：</p>
<p><img data-fancybox="gallery" data-sizes="auto" data-src="https://cdn.jsdelivr.net/gh/RhymeXmove/blogimg@latest/article/Mysql%E6%95%B0%E6%8D%AE%E5%BA%93-20210427/1NF-1.png" alt="1NF-1" class="lazyload"></p>
<p>在上面的表中，“家庭信息”和“学校信息”列均不满足原子性的要求，故不满足第一范式，调整如下：</p>
<p><img data-fancybox="gallery" data-sizes="auto" data-src="https://cdn.jsdelivr.net/gh/RhymeXmove/blogimg@latest/article/Mysql%E6%95%B0%E6%8D%AE%E5%BA%93-20210427/1NF-2.png" alt="1NF-2" class="lazyload"></p>
<p>可见，调整后的每一列都是不可再分的，因此满足第一范式（1NF）；</p>
<p><strong>第二范式（2NF）：在1NF的基础上，非码属性必须完全依赖于候选码（在1NF基础上消除非主属性对主码的部分函数依赖）</strong></p>
<p><strong>第二范式需要确保数据库表中的每一列都和主键相关，而不能只与主键的某一部分相关（主要针对联合主键而言）。</strong></p>
<p>举例说明：</p>
<p><img data-fancybox="gallery" data-sizes="auto" data-src="https://cdn.jsdelivr.net/gh/RhymeXmove/blogimg@latest/article/Mysql%E6%95%B0%E6%8D%AE%E5%BA%93-20210427/2NF-1.png" alt="2NF-1" class="lazyload"></p>
<p>在上图所示的情况中，同一个订单中可能包含不同的产品，因此主键必须是“订单号”和“产品号”联合组成，</p>
<p>但可以发现，产品数量、产品折扣、产品价格与“订单号”和“产品号”都相关，但是订单金额和订单时间仅与“订单号”相关，与“产品号”无关，</p>
<p>这样就不满足第二范式的要求，调整如下，需分成两个表：</p>
<p><img data-fancybox="gallery" data-sizes="auto" data-src="https://cdn.jsdelivr.net/gh/RhymeXmove/blogimg@latest/article/Mysql%E6%95%B0%E6%8D%AE%E5%BA%93-20210427/2NF-2.png" alt="2NF-2" class="lazyload"><img data-fancybox="gallery" data-sizes="auto" data-src="https://cdn.jsdelivr.net/gh/RhymeXmove/blogimg@latest/article/Mysql%E6%95%B0%E6%8D%AE%E5%BA%93-20210427/2NF-3.png" alt="2NF-3" class="lazyload"></p>
<p><strong>第三范式（3NF）：在2NF基础上，任何非主<a target="_blank" rel="noopener" href="https://baike.baidu.com/item/%E5%B1%9E%E6%80%A7">属性</a>不依赖于其它非主属性（在2NF基础上消除传递依赖）</strong></p>
<p><strong>第三范式需要确保数据表中的每一列数据都和主键直接相关，而不能间接相关。</strong></p>
<p>举例说明：</p>
<p><img data-fancybox="gallery" data-sizes="auto" data-src="https://cdn.jsdelivr.net/gh/RhymeXmove/blogimg@latest/article/Mysql%E6%95%B0%E6%8D%AE%E5%BA%93-20210427/3NF-1.png" alt="3NF-1" class="lazyload"></p>
<p>上表中，所有属性都完全依赖于学号，所以满足第二范式，但是“班主任性别”和“班主任年龄”直接依赖的是“班主任姓名”，</p>
<p>而不是主键“学号”，所以需做如下调整：</p>
<p><img data-fancybox="gallery" data-sizes="auto" data-src="https://cdn.jsdelivr.net/gh/RhymeXmove/blogimg@latest/article/Mysql%E6%95%B0%E6%8D%AE%E5%BA%93-20210427/3NF-2.png" alt="3NF-2" class="lazyload"><img data-fancybox="gallery" data-sizes="auto" data-src="https://cdn.jsdelivr.net/gh/RhymeXmove/blogimg@latest/article/Mysql%E6%95%B0%E6%8D%AE%E5%BA%93-20210427/3NF-3.png" alt="3NF-3" class="lazyload"></p>
<p>这样以来，就满足了第三范式的要求。</p>
<p>ps:如果把上表中的班主任姓名改成班主任教工号可能更确切，更符合实际情况，不过只要能理解就行。</p>
<p>(原文地址：<a target="_blank" rel="noopener" href="https://www.cnblogs.com/wsg25/p/9615100.html">https://www.cnblogs.com/wsg25/p/9615100.html</a>)</p>
<h2 id="JDBC"><a href="#JDBC" class="headerlink" title="JDBC"></a>JDBC</h2><p>程序通过数据库驱动JDBC和数据库打交道；</p>
<p>SUN公司为了简化开发人员的（对数据库的统一）操作，提供了一个（JAVA操作数据库的）规范，俗称JDBC;</p>
<p>对于开发人员来说，只要掌握jdbc就扣的操作即可；</p>
<pre><code class="java">//第一个jdbc程序
public static void main(String[] args) throws ClassNotFoundException, SQLException &#123;
        //1.加载驱动
        Class.forName(&quot;com.mysql.jdbc.Driver&quot;);  //固定写法，加载驱动

        //2.用户信息url
        String url = &quot;jdbc:mysql://localhost:3306/test01?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false&quot;;
        String name = &quot;root&quot;;
        String password = &quot;123456&quot;;

        //3.连接成功, 数据库对象 Connection  代表数据库
        Connection connection = DriverManager.getConnection(url, name, password);

        //4.执行SQL的对象 Statement 执行SQL的对象
        Statement statement = connection.createStatement();

        //5.执行SQL的对象 去执行 SQL ，可能存在结果， 查看返回对象
        String sql = &quot;SELECT * FROM user&quot;;

        ResultSet resultSet = statement.executeQuery(sql);

        while (resultSet.next()) &#123;
            System.out.println(&quot;id=&quot; + resultSet.getObject(&quot;id&quot;));
            System.out.println(&quot;username=&quot; + resultSet.getObject(&quot;username&quot;));
            System.out.println(&quot;address=&quot; + resultSet.getObject(&quot;address&quot;));
            System.out.println(&quot;=====================================&quot;);
        &#125;

        //6.释放连接
        resultSet.close();
        statement.close();
        connection.close();

    &#125;
</code></pre>
<h3 id="Statement对象"><a href="#Statement对象" class="headerlink" title="Statement对象"></a><code>Statement</code>对象</h3><ol>
<li>jdbc中的Statement对象用于向数据库发送SQL语句，想完成对数据库的增删改查，只需要通过这个对象向数据库发送增删改查语句即可；</li>
<li>Statement对象的executeUpdate方法用于向数据库发送增、删、改的SQL语句，executeUpdate执行完后，将会返回一个证书（即SQL语句影响的行数）;</li>
<li>Statement.executeQuery方法用于向数据库发送查询语句，executeQuery方法返回代表查询结果的ResultSet对象。</li>
</ol>
<h3 id="工具类-JdbcUtils"><a href="#工具类-JdbcUtils" class="headerlink" title="工具类   JdbcUtils"></a>工具类   JdbcUtils</h3><pre><code class="java">import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class JdbcUtils &#123;
    private static String driver = null;
    private static String url = null;
    private static String username = null;
    private static String password = null;
    static &#123;
        try &#123;
            InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream(&quot;db.properties&quot;);
            Properties properties = new Properties();
            properties.load(in);

            driver = properties.getProperty(&quot;driver&quot;);
            url = properties.getProperty(&quot;url&quot;);
            username = properties.getProperty(&quot;username&quot;);
            password = properties.getProperty(&quot;password&quot;);

            //驱动只用加载一次
            Class.forName(driver);

        &#125; catch (Exception e) &#123;
            e.printStackTrace();
        &#125;
    &#125;

    //获取连接
    public static Connection getConnection() throws SQLException &#123;
        return DriverManager.getConnection(url, username, password);
    &#125;

    //释放连接
    public static void release(Connection conn, Statement  st, ResultSet rs) &#123;
        if (rs!=null) &#123;
            try &#123;
                rs.close();
            &#125; catch (SQLException e) &#123;
                e.printStackTrace();
            &#125;
        &#125;
        if (st!=null) &#123;
            try &#123;
                st.close();
            &#125;catch (SQLException e)&#123;
                e.printStackTrace();
            &#125;
        &#125;
        if (conn!=null) &#123;
            try &#123;
                conn.close();
            &#125;catch (SQLException e)&#123;
                e.printStackTrace();
            &#125;
        &#125;

    &#125;
&#125;
</code></pre>
<h3 id="增删改都是st-executeUpdate-sql"><a href="#增删改都是st-executeUpdate-sql" class="headerlink" title="增删改都是st.executeUpdate(sql)"></a>增删改都是<code>st.executeUpdate(sql)</code></h3><h3 id="查询st-executeQuery-sql"><a href="#查询st-executeQuery-sql" class="headerlink" title="查询st.executeQuery(sql);"></a>查询<code>st.executeQuery(sql);</code></h3><pre><code class="java">            rs = st.executeQuery(sql);
            while (rs.next())&#123;
                System.out.println(rs.getObject(&quot;id&quot;));
                System.out.println(rs.getObject(&quot;username&quot;));
                System.out.println(rs.getObject(&quot;address&quot;));
            &#125;
</code></pre>
<h3 id="SQL注入"><a href="#SQL注入" class="headerlink" title="SQL注入"></a>SQL注入</h3><p>sql存在漏洞，会被攻击导致数据泄露，SQL 会被拼接  or</p>
<pre><code class="java">public static void main(String[] args) &#123;
        login(&quot; &#39;or &#39;1=1&quot;, &quot; &#39;or &#39;1=1&quot;);
    &#125;

    public static void login(String username, String password) &#123;
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;

        try &#123;
            conn = JdbcUtils.getConnection(); //获取数据库连接
            st = conn.createStatement();
            String sql = &quot;select username,address from user where username=&#39;&quot; + username + &quot;&#39; and address=&#39;&quot;+password+&quot;&#39;&quot;;

            rs = st.executeQuery(sql);
            while (rs.next())&#123;
                System.out.println(rs.getObject(&quot;username&quot;));
                System.out.println(rs.getObject(&quot;address&quot;));
                System.out.println(&quot;=====================================&quot;);
            &#125;

        &#125; catch (SQLException e) &#123;
            e.printStackTrace();
        &#125; finally &#123;
            JdbcUtils.release(conn, st, rs);
        &#125;
    &#125;
</code></pre>
<h3 id="preparedStatement-对象"><a href="#preparedStatement-对象" class="headerlink" title="preparedStatement 对象"></a><code>preparedStatement</code> 对象</h3><p><code>preparedStatement</code>防止注入的本质是它将传递进来的参数当做字符，假设其中存在转义字符，比如(`)会被直接转义；</p>
<pre><code class="java">public static void main(String[] args) &#123;
        Connection conn = null;
        PreparedStatement pst = null;

        try &#123;
            conn = JdbcUtils.getConnection();
            String sql = &quot;INSERT INTO user(id,username,address) VALUES(?,?,?)&quot;;
            pst = conn.prepareStatement(sql);  //预编译SQL，重写SQL,然后不执行

            pst.setInt(1, 22);
            pst.setString(2, &quot;wangwu&quot;);
            pst.setString(3, &quot;成华大道&quot;);

            pst.executeUpdate();
        &#125; catch (SQLException e) &#123;
            e.printStackTrace();
        &#125;finally &#123;
            JdbcUtils.release(conn, pst, null);
        &#125;
    &#125;
</code></pre>
<h2 id="Idea连接mysql数据库"><a href="#Idea连接mysql数据库" class="headerlink" title="Idea连接mysql数据库"></a>Idea连接mysql数据库</h2><p><img data-fancybox="gallery" data-sizes="auto" data-src="https://cdn.jsdelivr.net/gh/RhymeXmove/blogimg@latest/article/Mysql%E6%95%B0%E6%8D%AE%E5%BA%93-20210427/20210427182334.png" alt="20210427182334" class="lazyload"></p>
<p><img src="https://cdn.jsdelivr.net/gh/RhymeXmove/blogimg@latest/article/Mysql%E6%95%B0%E6%8D%AE%E5%BA%93-20210427/20210427182427.png"></p>
<ul>
<li>连接错误，修改 <code>Advanced</code> 配置中的 <code>ServerTimeZone</code> 为 <code>UTC</code>；</li>
<li>连接成功后可以在 <code>Schemas </code>中勾选要用到的数据库；</li>
</ul>
<p><img src="https://cdn.jsdelivr.net/gh/RhymeXmove/blogimg@latest/article/Mysql%E6%95%B0%E6%8D%AE%E5%BA%93-20210427/20210427183235.png"></p>
<h2 id="数据库表事务"><a href="#数据库表事务" class="headerlink" title="数据库表事务"></a>数据库表事务</h2><h3 id="原子性（Atomicity）"><a href="#原子性（Atomicity）" class="headerlink" title="原子性（Atomicity）"></a>原子性（Atomicity）</h3><p>　　原子性是指事务包含的所有操作要么全部成功，要么全部失败回滚，这和前面两篇博客介绍事务的功能是一样的概念，因此事务的操作如果成功就必须要完全应用到数据库，如果操作失败则不能对数据库有任何影响。</p>
<h3 id="一致性（Consistency）"><a href="#一致性（Consistency）" class="headerlink" title="一致性（Consistency）"></a>一致性（Consistency）</h3><p>　　一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态，也就是说一个事务执行之前和执行之后都必须处于一致性状态。</p>
<p>　　拿转账来说，假设用户A和用户B两者的钱加起来一共是5000，那么不管A和B之间如何转账，转几次账，事务结束后两个用户的钱相加起来应该还得是5000，这就是事务的一致性。</p>
<h3 id="隔离性（Isolation）"><a href="#隔离性（Isolation）" class="headerlink" title="隔离性（Isolation）"></a>隔离性（Isolation）</h3><p>　　隔离性是当多个用户并发访问数据库时，比如操作同一张表时，数据库为每一个用户开启的事务，不能被其他事务的操作所干扰，多个并发事务之间要相互隔离。</p>
<p>　　即要达到这么一种效果：对于任意两个并发的事务T1和T2，在事务T1看来，T2要么在T1开始之前就已经结束，要么在T1结束之后才开始，这样每个事务都感觉不到有其他事务在并发地执行。</p>
<p>　　关于事务的隔离性数据库提供了多种隔离级别，稍后会介绍到。</p>
<h3 id="持久性（Durability）"><a href="#持久性（Durability）" class="headerlink" title="持久性（Durability）"></a>持久性（Durability）</h3><p>　　持久性是指一个事务一旦被提交了，那么对数据库中的数据的改变就是永久性的，即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。</p>
<p>　　例如我们在使用JDBC操作数据库时，在提交事务方法后，提示用户事务操作完成，当我们程序执行完成直到看到提示后，就可以认定事务以及正确提交，即使这时候数据库出现了问题，也必须要将我们的事务完全执行完成，否则就会造成我们看到提示事务处理完毕，但是数据库因为故障而没有执行事务的重大错误。</p>
<p>　　以上介绍完事务的四大特性(简称ACID)，现在重点来说明下事务的隔离性，当多个线程都开启事务操作数据库中的数据时，数据库系统要能进行隔离操作，以保证各个线程获取数据的准确性，在介绍数据库提供的各种隔离级别之前，我们先看看如果不考虑事务的隔离性，会发生的几种问题：</p>
<h3 id="脏读"><a href="#脏读" class="headerlink" title="脏读"></a>脏读</h3><p>　　脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。</p>
<p>　　当一个事务正在多次修改某个数据，而在这个事务中这多次的修改都还未提交，这时一个并发的事务来访问该数据，就会造成两个事务得到的数据不一致。例如：用户A向用户B转账100元，对应SQL命令如下</p>
<pre><code class="sql">    update account set money=money+100 where name=’B’;  (此时A通知B)

    update account set money=money - 100 where name=’A’;
</code></pre>
<p>　　当只执行第一条SQL时，A通知B查看账户，B发现确实钱已到账（此时即发生了脏读），而之后无论第二条SQL是否执行，只要该事务不提交，则所有操作都将回滚，那么当B以后再次查看账户时就会发现钱其实并没有转。</p>
<h3 id="不可重复读"><a href="#不可重复读" class="headerlink" title="不可重复读"></a>不可重复读</h3><p>　　不可重复读是指在对于数据库中的某个数据，一个事务范围内多次查询却返回了不同的数据值，这是由于在查询间隔，被另一个事务修改并提交了。</p>
<p>　　例如事务T1在读取某一数据，而事务T2立马修改了这个数据并且提交事务给数据库，事务T1再次读取该数据就得到了不同的结果，发送了不可重复读。</p>
<p>　　不可重复读和脏读的区别是，脏读是某一事务读取了另一个事务未提交的脏数据，而不可重复读则是读取了前一事务提交的数据。</p>
<p>　　在某些情况下，不可重复读并不是问题，比如我们多次查询某个数据当然以最后查询得到的结果为主。但在另一些情况下就有可能发生问题，例如对于同一个数据A和B依次查询就可能不同，A和B就可能打起来了……</p>
<h3 id="虚读-幻读"><a href="#虚读-幻读" class="headerlink" title="虚读(幻读)"></a>虚读(幻读)</h3><p>　　幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作，这时事务T2又对这个表中插入了一行数据项，而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据，会发现还有一行没有修改，其实这行是从事务T2中添加的，就好像产生幻觉一样，这就是发生了幻读。</p>
<p>　　幻读和不可重复读都是读取了另一条已经提交的事务（这点就脏读不同），所不同的是不可重复读查询的都是同一个数据项，而幻读针对的是一批数据整体（比如数据的个数）。</p>
<p>现在来看看MySQL数据库为我们提供的四种隔离级别：</p>
<ul>
<li>Serializable (串行化)：可避免脏读、不可重复读、幻读的发生。</li>
<li>Repeatable read (可重复读)：可避免脏读、不可重复读的发生。</li>
<li>Read committed (读已提交)：可避免脏读的发生。</li>
<li>Read uncommitted (读未提交)：最低级别，任何情况都无法保证。</li>
</ul>
<p>　以上四种隔离级别最高的是Serializable级别，最低的是Read uncommitted级别，当然级别越高，执行效率就越低。像Serializable这样的级别，就是以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待，所以平时选用何种隔离级别应该根据实际情况。在MySQL数据库中默认的隔离级别为Repeatable read (可重复读)。</p>
<p>　　在MySQL数据库中，支持上面四种隔离级别，默认的为Repeatable read (可重复读)；而在Oracle数据库中，只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别，其中默认的为Read committed级别。</p>
<p>　　在MySQL数据库中查看当前事务的隔离级别：</p>
<pre><code class="sql">    select @@tx_isolation;
</code></pre>
<p>　　在MySQL数据库中设置事务的隔离 级别：</p>
<pre><code class="sql">    set  [glogal | session]  transaction isolation level 隔离级别名称;

    set tx_isolation=’隔离级别名称;’
</code></pre>
<h3 id="java代码实现事务"><a href="#java代码实现事务" class="headerlink" title="java代码实现事务"></a>java代码实现事务</h3><ol>
<li>开启事务<code>onn.setAutoCommit(false);</code></li>
<li>一组业务执行完毕，提交事务<code>conn.commit();</code></li>
<li>可以在catch语句中显示的定义回滚语句，但默认的，失败就是会回滚的；</li>
</ol>
<pre><code class="java">public static void main(String[] args) &#123;
        Connection conn = null;
        PreparedStatement st = null;
        ResultSet rs = null;

        try &#123;
            conn = JdbcUtils.getConnection();
            //关闭数据库自动提交，自动会开启事务
            conn.setAutoCommit(false);  //开启事务

            String sql1 = &quot;UPDATE ACCOUNT SET money=money-100 where name=&#39;A&#39;&quot;;
            st = conn.prepareStatement(sql1);
            st.executeUpdate();

            int x = 1/0; //模拟出错，失败自动回滚

            String sql2 = &quot;UPDATE ACCOUNT SET money=money+100 where name=&#39;B&#39;&quot;;
            st = conn.prepareStatement(sql2);
            st.executeUpdate();

            //事务完毕，提交事务
            conn.commit();
            System.out.println(&quot;transaction finished&quot;);
        &#125; catch (SQLException e) &#123;
            try &#123;
                conn.rollback(); //回滚
            &#125; catch (SQLException ex) &#123;
                ex.printStackTrace();
            &#125;
            e.printStackTrace();
        &#125;finally &#123;
            JdbcUtils.release(conn,st,rs);
        &#125;
    &#125;
</code></pre>
<h2 id="数据库连接池"><a href="#数据库连接池" class="headerlink" title="数据库连接池"></a>数据库连接池</h2><p>数据库连接 - 执行完毕 - 释放</p>
<p>连接 - 释放十分浪费系统资源</p>
<p><strong>池化技术：准备一些预先的资源，过来就连接预先准备好的</strong></p>
<p>最小连接数（常用连接数）：10</p>
<p>最大连接数：100    业务最高承载上限，超出最大连接数的等待</p>
<p>等待超时: 100ms</p>
<p>编写连接池，实现一个接口，DataSource</p>
<p>开源数据源实现：</p>
<ul>
<li>DBCP</li>
<li>C3P0</li>
<li>druid 德鲁伊 阿里巴巴</li>
</ul>
<p>使用这些数据库连接池之后，我们在项目开发中就不需要编写连接数据库的代码；区别是性能上的区别；</p>
<h2 id="DBCP"><a href="#DBCP" class="headerlink" title="DBCP"></a>DBCP</h2><p>需要用到的jar包</p>
<p>commons-dbcp-1.4         commons-pool-1.6</p>
<h2 id="C3P0"><a href="#C3P0" class="headerlink" title="C3P0"></a>C3P0</h2><p>需要用到的jar包</p>
<p>c3p0-0.9.5.5         mchange-commons-java-0.2.19</p>
<p>无论使用什么数据源，本质是一样的，DataSource接口不会变，方法就不会变。</p>
<p>druid结合springboot使用。</p>

  </article>

  
    
  <div class="nexmoe-post-copyright">
    <strong>本文作者：</strong>shanX<br>
    <strong>本文链接：</strong><a href="https://rhymexmove.github.io/2021/04/27/b8128014f023/" title="https:&#x2F;&#x2F;rhymexmove.github.io&#x2F;2021&#x2F;04&#x2F;27&#x2F;b8128014f023&#x2F;" target="_blank" rel="noopener">https:&#x2F;&#x2F;rhymexmove.github.io&#x2F;2021&#x2F;04&#x2F;27&#x2F;b8128014f023&#x2F;</a><br>
    
      <strong>版权声明：</strong>本文采用 <a href="https://creativecommons.org/licenses/by-nc-sa/3.0/cn/deed.zh" target="_blank">CC BY-NC-SA 3.0 CN</a> 协议进行许可
    
  </div>


  
  
  <div class="nexmoe-post-meta nexmoe-rainbow">
    
        <a class="nexmoefont icon-appstore-fill -link" href="/categories/DB/">DB</a>
    
    
        <a class="nexmoefont icon-tag-fill -none-link" href="/tags/mysql/" rel="tag">mysql</a> <a class="nexmoefont icon-tag-fill -none-link" href="/tags/%E7%8B%82%E7%A5%9E%E8%AF%B4/" rel="tag">狂神说</a>
    
</div>

  <div class="nexmoe-post-footer">
    <section class="nexmoe-comment">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/gitalk@1.7.2/dist/gitalk.min.css">
<div id="gitalk"></div>
<script src="https://cdn.jsdelivr.net/npm/gitalk@1.7.2/dist/gitalk.min.js"></script>
<script type="text/javascript">
    var gitalk = new Gitalk({
        clientID: 'a2d666d91d6af126f538',
        clientSecret: '9c79e44494cd9fae312629457ae9b534e01a963e',
        id: decodeURI(window.location.pathname),
        repo: 'RhymeXmove.github.io',
        owner: 'RhymeXmove',
        admin: 'RhymeXmove'
    })
    gitalk.render('gitalk')
</script>
</section>
  </div>
</div>
                            <div class="nexmoe-post-right">
                                <div class="nexmoe-fixed">
                                    <div class="nexmoe-tool">
                                        <a href="#nexmoe-content" class="toc-link" aria-label="回到顶部" title="top"><button class="mdui-fab mdui-ripple"><i class="nexmoefont icon-caret-top"></i></button></a>
                                    </div>
                                </div>
                            </div>
                    </div>
                </div>
                <script src="https://cdn.jsdelivr.net/combine/npm/lazysizes@5.1.0/lazysizes.min.js,gh/highlightjs/cdn-release@9.15.8/build/highlight.min.js,npm/mdui@0.4.3/dist/js/mdui.min.js?v=1"></script>
<script>
	hljs.initHighlightingOnLoad();
</script>

<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/gh/fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.js"></script>


<script src="https://cdn.jsdelivr.net/gh/xtaodada/xtaodada.github.io@0.0.2/copy.js"></script>
 

<script src="/js/app.js?v=1649858550927"></script>

<script src="https://cdn.jsdelivr.net/npm/justifiedGallery@3.8.1/dist/js/jquery.justifiedGallery.min.js"></script>
<script>
	$(".justified-gallery").justifiedGallery({
		rowHeight: 160,
		margins: 10,
	});
</script>

                    





        </body>

</html>